home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d14 / dde_lib.arc / SESSUTIL.C < prev    next >
C/C++ Source or Header  |  1990-12-25  |  7KB  |  285 lines

  1. /* **********************************************************
  2.    sessutil.c - Session DDE client for variable maintenance
  3.  
  4.    Placed in public domain by Horizon Technologies Inc. 1990
  5.  
  6.   ***revision history***
  7. 1 SESSUTIL.C 29-Jan-90,13:35:12,`JMH' Base version
  8. 2 SESSUTIL.C 28-Feb-90,13:52:26,`JMH' Version as of 3/5/90
  9. 3 SESSUTIL.C 6-Mar-90,15:23:10,`JMH' Version as of 3/5/90
  10. 4 SESSUTIL.C 19-Jun-90,10:51:20,`JMH' Version as of 6/25/90
  11. 5 SESSUTIL.C 25-Jun-90,14:48:08,`JMH' Version as of 6/25/90
  12. 6 SESSUTIL.C 17-Sep-90,11:38:30,`JMH' Version 1.3
  13.   ***revision history***
  14. ********************************************************** */
  15. #define MAIN
  16. #define NOCOMM
  17.  
  18. #include "windows.h"
  19. #include "stdio.h"
  20. #include "stdlib.h"
  21. #include "string.h"
  22. #include "dde.h"
  23. #include "ddelib.h"
  24. #include "sessutil.h"
  25.  
  26. /* Undocumented windows functions */
  27. int FAR PASCAL lstrlen (LPSTR);
  28. LPSTR FAR PASCAL lstrcpy (LPSTR, LPSTR);
  29. LPSTR FAR PASCAL lstrcat (LPSTR, LPSTR);
  30. int FAR PASCAL lstrcmp (LPSTR, LPSTR);
  31.  
  32. /* Globals */
  33. static HANDLE ghInstance;
  34. static HWND ghWnd;
  35. static char *gszAppName = "SessUtil";
  36. static DDECALLBACK glpfnUser;
  37. static FARPROC glpfnModify;
  38. static FARPROC glpfnAbout;
  39. static HANDLE ghSession;
  40. static char gszUser[100];
  41.  
  42. /* Functions */
  43. int PASCAL WinMain (HANDLE, HANDLE, LPSTR, int);
  44. long FAR PASCAL SessutilProc (HWND, unsigned, WORD, LONG);
  45. WORD FAR PASCAL User (HWND, unsigned, LPSTR, HANDLE);
  46. BOOL FAR PASCAL Modify (HWND, unsigned, WORD, LONG);
  47. void Poke (void);
  48. BOOL FAR PASCAL About (HWND, unsigned, WORD, LONG);
  49.  
  50.  
  51. int PASCAL WinMain (hInstance, hPrevInstance, lpCmdLine, nCmdShow)
  52. HANDLE hInstance;
  53. HANDLE hPrevInstance;
  54. LPSTR lpCmdLine;
  55. int nCmdShow;
  56. {
  57.    WNDCLASS wndclass;
  58.    MSG msg;
  59.  
  60.    ghInstance = hInstance;
  61.  
  62.    if ( !hPrevInstance )
  63.       {
  64.       wndclass.style = CS_HREDRAW | CS_VREDRAW;
  65.       wndclass.lpfnWndProc = SessutilProc;
  66.       wndclass.cbClsExtra = 0;
  67.       wndclass.cbWndExtra = 0;
  68.       wndclass.hInstance = hInstance;
  69.       wndclass.hIcon = LoadIcon ( hInstance, gszAppName );
  70.       wndclass.hCursor = LoadCursor ( NULL, IDC_ARROW );
  71.       wndclass.hbrBackground = (HBRUSH) GetStockObject ( WHITE_BRUSH );
  72.       wndclass.lpszMenuName = gszAppName;
  73.       wndclass.lpszClassName = gszAppName;
  74.  
  75.       if ( !RegisterClass ( &wndclass ) )
  76.      return FALSE;
  77.       }  /* if ! hPrevInstance */
  78.  
  79.    ghWnd = CreateWindow ( gszAppName, gszAppName, WS_OVERLAPPEDWINDOW,
  80.               CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL,
  81.               hInstance, NULL );
  82.  
  83.    if ( !ghWnd )
  84.       return ( NULL );
  85.  
  86.    ShowWindow ( ghWnd, nCmdShow );
  87.    UpdateWindow ( ghWnd );
  88.  
  89.    while ( GetMessage ( &msg, NULL, NULL, NULL ) )
  90.       {
  91.       TranslateMessage ( &msg );
  92.       DispatchMessage ( &msg );
  93.       }  /* while GetMessage */
  94.  
  95.    return ( msg.wParam );
  96. }  /* function WinMain */
  97.  
  98.  
  99. long FAR PASCAL SessutilProc (hWnd, iMessage, wParam, lParam)
  100. HWND hWnd;
  101. unsigned iMessage;
  102. WORD wParam;
  103. LONG lParam;
  104. {
  105.    DDEADVISE ddeAdvise;
  106.    PAINTSTRUCT ps;
  107.  
  108.    switch ( iMessage )
  109.       {
  110.       case WM_CREATE:
  111.      /* Provide callback addresses for DDE callback function */
  112.      glpfnUser = (DDECALLBACK) MakeProcInstance ( (FARPROC) User,
  113.                               ghInstance );
  114.  
  115.      /* Inititate a DDE Session with SESSION */
  116.      if ( !( ghSession = DDEInitiate ( hWnd, "Session", "Variables" ) ) )
  117.         break;
  118.  
  119.      /* Ask to be advised everytime the User variable changes */
  120.      ddeAdvise.reserved = 0xABC;
  121.      ddeAdvise.fDeferUpd = FALSE;
  122.      ddeAdvise.fAckReq = TRUE;
  123.      ddeAdvise.cfFormat = CF_TEXT;
  124.      DDEAdvise ( ghSession, "User", &ddeAdvise, glpfnUser );
  125.      break;
  126.  
  127.       case WM_PAINT:
  128.      BeginPaint ( hWnd, &ps );
  129.      TextOut ( ps.hdc, 0, 0, gszUser, strlen ( gszUser ) );
  130.      EndPaint ( hWnd, &ps );
  131.      break;
  132.  
  133.       case WM_COMMAND:
  134.      switch ( wParam )
  135.         {
  136.         case IDM_MODIFY:
  137.            glpfnModify = MakeProcInstance ( Modify, ghInstance );
  138.            if ( DialogBox ( ghInstance, "Modify", hWnd, glpfnModify ) )
  139.           Poke ();
  140.            FreeProcInstance ( glpfnModify );
  141.            break;
  142.  
  143.         case IDM_EXIT:
  144.            SendMessage ( hWnd, WM_CLOSE, 0, 0L );
  145.            break;
  146.  
  147.         case IDM_ABOUT:
  148.            glpfnAbout = MakeProcInstance ( About, ghInstance );
  149.            DialogBox ( ghInstance, "About", hWnd, glpfnAbout );
  150.            FreeProcInstance ( glpfnAbout );
  151.            break;
  152.         }  /* switch wParam */
  153.      break;
  154.  
  155.       case WM_DESTROY:
  156.      /* Cancel the advise circuit for User */
  157.      DDEUnadvise ( ghSession, "User" );
  158.  
  159.      /* End the session with SESSION */
  160.      DDETerminate ( ghSession );
  161.  
  162.      PostQuitMessage ( 0 );
  163.      break;
  164.  
  165.       default:
  166.      return DefWindowProc ( hWnd, iMessage, wParam, lParam );
  167.       }  /* switch iMessage */
  168.  
  169.    return 0L;
  170. }  /* function SessutilProc */
  171.  
  172.  
  173. /* Callback routine to notify when the User variable changes */
  174. WORD FAR PASCAL User (hSession, iMessage, lpszItem, hData)
  175. HWND hSession;
  176. unsigned iMessage;
  177. LPSTR lpszItem;
  178. HANDLE hData;
  179. {
  180.    LPDDEDATA lpData;
  181.  
  182.    switch ( iMessage )
  183.       {
  184.       case DDE_ACK:
  185.      break;
  186.  
  187.       case DDE_DATA:
  188.      /* Move data to the current user string */
  189.      lpData = (LPDDEDATA) GlobalLock ( hData );
  190.      lstrcpy ( gszUser, lpData->Value );
  191.      GlobalUnlock ( hData );
  192.  
  193.      /* Force a repaint */
  194.      InvalidateRect ( ghWnd, NULL, TRUE );
  195.      break;
  196.  
  197.       case DDE_TERMINATE:
  198.      break;
  199.       }
  200.  
  201.    return NULL;
  202. }  /* function User */
  203.  
  204.  
  205. /* Modify User variable dialog box */
  206. BOOL FAR PASCAL Modify (hDlg, iMessage, wParam, lParam)
  207. HWND hDlg;
  208. unsigned iMessage;
  209. WORD wParam;
  210. LONG lParam;
  211. {
  212.    switch ( iMessage )
  213.       {
  214.       case WM_INITDIALOG:
  215.      /* Initialize the value */
  216.      SetDlgItemText ( hDlg, IDD_USER, gszUser );
  217.      break;
  218.  
  219.       case WM_COMMAND:
  220.      switch ( wParam )
  221.         {
  222.         case IDOK:
  223.            /* Get the new value */
  224.            GetDlgItemText ( hDlg, IDD_USER, gszUser, sizeof ( gszUser ) )
  225.         ;
  226.  
  227.            EndDialog ( hDlg, TRUE );
  228.            break;
  229.  
  230.         case IDCANCEL:
  231.            EndDialog ( hDlg, FALSE );
  232.            break;
  233.         }  /* switch wParam */
  234.      break;
  235.  
  236.       default:
  237.      return FALSE;
  238.       }  /* switch iMessage */
  239.    return TRUE;
  240. }  /* function Modify */
  241.  
  242.  
  243. /* Modify User variable dialog box */
  244. void Poke ()
  245. {
  246.    HANDLE hPoke;
  247.    LPDDEPOKE lpPoke;
  248.  
  249.    /* Create a poke structure */
  250.    hPoke = GlobalAlloc ( GHND | GMEM_DDESHARE, (DWORD) sizeof ( DDEPOKE ) +
  251.              strlen ( gszUser ) );
  252.  
  253.    /* Fill in the poke structure */
  254.    lpPoke = (LPDDEPOKE) GlobalLock ( hPoke );
  255.    lpPoke->fRelease = TRUE;
  256.    lpPoke->cfFormat = CF_TEXT;
  257.    lstrcpy ( lpPoke->Value, gszUser );
  258.    GlobalUnlock ( hPoke );
  259.  
  260.    DDEPoke ( ghSession, "User", hPoke );
  261. }  /* function Poke */
  262.  
  263.  
  264. /* About box */
  265. BOOL FAR PASCAL About (hDlg, iMessage, wParam, lParam)
  266. HWND hDlg;
  267. unsigned iMessage;
  268. WORD wParam;
  269. LONG lParam;
  270. {
  271.    switch ( iMessage )
  272.       {
  273.       case WM_INITDIALOG:
  274.      break;
  275.  
  276.       case WM_COMMAND:
  277.      EndDialog ( hDlg, FALSE );
  278.      break;
  279.  
  280.       default:
  281.      return FALSE;
  282.       }  /* switch iMessage */
  283.    return TRUE;
  284. }  /* function About */
  285.